// EventBus.js
import { provide, inject } from 'vue'

const EventBusSymbol = Symbol()
//定义了一个自定义的 Hook useEventBus()，用于提供事件总线功能。在这个 Hook 中：
export function useEventBus() {
  //eventMap 用于存储 事件名称 和 对应的监听器函数数组。
  const eventMap = {}
  //用于触发指定事件，并将参数传递给对应的监听器函数(函数名，传递参数)
  const Emit = (eventName: any, ...args: any) => {
    const listeners = eventMap[eventName]
    if (listeners) {
      listeners.forEach(listener => listener(...args))
    }
  }
  //用于监听指定事件，将监听器函数添加到对应事件的监听器数组中。
  const on = (eventName, listener) => {
    if (!eventMap[eventName]) {
      eventMap[eventName] = []
    }
    eventMap[eventName].push(listener)
  }
  //方法用于移除指定事件的指定监听器。
  const off = (eventName, listener) => {
    const listeners = eventMap[eventName]
    if (listeners) {
      const index = listeners.indexOf(listener)
      if (index !== -1) {
        listeners.splice(index, 1)
      }
    }
  }

  provide(EventBusSymbol, {
    Emit,
    on,
    off
  })
}

export function useEventBusInject() {
  const eventBus = inject(EventBusSymbol)
  if (!eventBus) {
    throw new Error('useEventBusInject must be used inside a component wrapped with useEventBus')
  }
  return eventBus
}
